#ifndef __FRAMEPROCESS_
#define __FRAMEPROCESS_

#include <librealsense2/rs.hpp>
#include <inference_engine.hpp>
#include <opencv2/opencv.hpp>
#include "Parameter.h"

using namespace InferenceEngine;
using namespace rs2;

#define LIBREALSENSE 1
#define IMREADFIGURE 2    
#define VIDEOCAPTURE 3

class FrameProcessor : public rs2::align, public rs2::pipeline, public cv::VideoCapture
{
public:
    using rs2::align::align;
    using rs2::pipeline::start;

    ~FrameProcessor(){};

    // 初始化感知器状态
    void InitState(const std::string &);
    // 获取 RGB 图像
    cv::Mat obtain_RGBImage();
    // 获取深度图像
    cv::Mat obtain_DepthImage();
    // 获取深度相机内参
    inline rs2_intrinsics getDepIntri(){return this->_depthIntri;};

private:
    // 设置原始影像流的参数
    void _set_OriginStream();
    // 打开影像流通道
    void _startPipe();
    // 获取深度像素对应长度单位（米）的换算比例
    float _getDepScale(rs2::device);
    // 源影像流转成Mat
    cv::Mat _frameToMat(const rs2::frame &);
    // 深度图对齐到彩色图
    cv::Mat _depAlign2Rgb(const cv::Mat &, const cv::Mat &);

private:
    // 感知器状态 -- LIBREALSENSE 相机流 -- IMREADFIGURE 图像帧 -- VIDEOCAPTURE 视频流
    size_t _state;
    // 数据通道参数
    rs2::config _cfg;
    rs2::pipeline_profile _profile;
    // rgb相机内参
    rs2_intrinsics _rgbIntri;
    rs2_intrinsics _depthIntri;
    // 深度相机坐标系到RGB相机坐标系的欧式变换矩阵
    rs2_extrinsics _extrinDepth2Color;

    frameset _alignedSet;
    // 影像流输入路径
    std::string _frameStream;
    // 感知RGB图像
    cv::Mat _rgbImg;
    // 感知深度图像
    cv::Mat _depthImg;
};

using p_perception = std::shared_ptr<FrameProcessor>;

#endif